/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 字节流;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Description FileInput、OutputStream字节流
 * 节点流之一
 * 处理非文本文件（音频视频图片等） 也可以操作文本文件（建议使用字符流）
 * 复制文件是都可以的
 * 文本文件  txt java c cpp py 等等
 * 非文本    png avi jpg 等等
 * @Author 俊昭
 * @Date 2022/4/25
 */
public class FileInputOutputTest {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        File f1 = new File("C:\\Users\\Junzhao\\IOStream\\字节流\\实例视频.mkv");
        File f2 = new File("C:\\Users\\Junzhao\\IOStream\\新建文件夹");

        FileInputOutputStreamCopy(f1, f2);
        long end = System.currentTimeMillis();

        System.out.println("花费时间:" + (end - start) + "ms");
        // 99.6 MB (104,493,563 字节) 用时740 ms 1024byte(1k)大小的 缓冲数组
        // 8192byte(8k)大小的 缓冲数组 145ms
    }

    /**
     * @param originalFile 被复制的文件
     * @param pathCopyTo   要复制到的路径 需要是一个文件夹
     * @description FileInput、OutputStream实现文件复制
     * @author 俊昭
     * @date 2022/4/24
     */
    public static void FileInputOutputStreamCopy(File originalFile, File pathCopyTo) {
        if (originalFile.isFile() && pathCopyTo.isDirectory()) {
            File newFile = new File(pathCopyTo, originalFile.getName());
            FileInputStream r = null;
            FileOutputStream w = null;

            try {
                // 创建操作的流
                r = new FileInputStream(originalFile);
                w = new FileOutputStream(newFile);
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                byte cbuf[] = new byte[8192];
                int len = 0;
                while ((len = r.read(cbuf)) != - 1) {// 读入内存
                    w.write(cbuf, 0, len);// 输出原文件内容

                }
                System.out.println("复制成功");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {

                try {
                    if (r != null) {
                        r.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (w != null) {
                            w.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }

        } else {
            throw new RuntimeException("您输入的文件或路径有误！");
        }

    }

    @Test
    public void FileInputStreamTest() {

        File file = new File("C:\\Users\\Junzhao\\IOStream\\字符流\\FileWriter.txt");

        FileInputStream in = null;
        try {
            in = new FileInputStream(file);

            byte[] bbuf = new byte[64];
            int len = 0;
            while ((len = in.read(bbuf)) != - 1) {
                // public String(byte bytes[], int offset, int length)
                // 通过使用平台的默认字符集解码指定的字节数组来构造一个新的String。
                // 新字符串的长度是字符集的函数，因此可能不等于子数组的长度。
                String s = new String(bbuf, 0, len);
                System.out.println(s);
//                for (int i = 0; i < len; i++) {
//                    System.out.println(bbuf[i]);
//                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}
